package com.whfc.ms.api.sys.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.whfc.common.enums.AppType;
import com.whfc.common.exception.BizException;
import com.whfc.common.result.ResultEnum;
import com.whfc.common.weixin.bean.OAuthAccessToken;
import com.whfc.common.weixin.bean.OAuthUserInfo;
import com.whfc.common.weixin.mp.OAuth2Api;
import com.whfc.fuum.dto.WxConfigDTO;
import com.whfc.fuum.service.WxConfigService;
import com.whfc.ms.api.sys.service.WxOAuthApiService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

@Service
public class WxOAuthApiServiceImpl implements WxOAuthApiService {

    @DubboReference(interfaceClass = WxConfigService.class, version = "1.0.0")
    private WxConfigService wxConfigService;

    @Override
    public OAuthAccessToken getAccessToken(AppType appType, String code) {
        WxConfigDTO configDTO = this.getWxConfig(appType);
        String response = OAuth2Api.accessToken(configDTO.getAppId(), configDTO.getAppSecret(), code);
        OAuthAccessToken accessToken = JSON.parseObject(response, OAuthAccessToken.class);
        return accessToken;
    }

    @Override
    public OAuthAccessToken refreshAccessToken(AppType appType) {
        WxConfigDTO configDTO = this.getWxConfig(appType);
        //todo 从缓存中获取refreshToken
        String response = OAuth2Api.refreshAccessToken(configDTO.getAppId(), "");
        OAuthAccessToken accessToken = JSON.parseObject(response, OAuthAccessToken.class);
        return accessToken;
    }

    @Override
    public boolean auth(AppType appType, String openId) {
        WxConfigDTO configDTO = this.getWxConfig(appType);
        //todo 从缓存中获取accessToken
        String accessToken = "";
        String response = OAuth2Api.auth(accessToken, openId);
        JSONObject ret = JSONObject.parseObject(response);
        if (ret != null && ret.containsKey("errcode") && "0".equals(ret.getInteger("errcode"))) {
            return true;
        }
        return false;
    }

    @Override
    public OAuthUserInfo getUserInfo(AppType appType, String openId) {
        WxConfigDTO configDTO = this.getWxConfig(appType);
        //todo 从缓存中获取accessToken
        String accessToken = "";
        String response = OAuth2Api.userInfo(accessToken, openId);
        OAuthUserInfo userInfo = JSON.parseObject(response, OAuthUserInfo.class);
        return userInfo;
    }

    @Override
    public OAuthUserInfo getUserInfoByCode(AppType appType, String code) {
        WxConfigDTO configDTO = this.getWxConfig(appType);
        String response = OAuth2Api.accessToken(configDTO.getAppId(), configDTO.getAppSecret(), code);
        OAuthAccessToken token = JSON.parseObject(response, OAuthAccessToken.class);
        if (token == null || StringUtils.isEmpty(token.getOpenid())) {
            throw new BizException(ResultEnum.FAILURE.getCode(), "微信oauth授权失败");
        }
        response = OAuth2Api.userInfo(token.getAccessToken(), token.getOpenid());
        OAuthUserInfo userInfo = JSON.parseObject(response, OAuthUserInfo.class);
        if (userInfo == null || StringUtils.isEmpty(userInfo.getOpenid()) || StringUtils.isEmpty(userInfo.getUnionid())) {
            throw new BizException(ResultEnum.FAILURE.getCode(), "微信oauth授权失败");
        }
        return userInfo;
    }

    /**
     * 获取微信配置
     *
     * @param appType
     * @return
     */
    private WxConfigDTO getWxConfig(AppType appType) {
        WxConfigDTO configDTO = wxConfigService.getWxConfig(appType.name(), false);
        if (ObjectUtils.isEmpty(configDTO) || StringUtils.isEmpty(configDTO.getAppId()) || StringUtils.isEmpty(configDTO.getAppSecret())) {
            throw new BizException(ResultEnum.FAILURE.getCode(), "获取sessionKey失败,小程序配置参数错误");
        }
        return configDTO;
    }
}
